/*******************************************************************************************
 *      @name   tcp_server.c
 *      @brief  这是在linux系统下的使用TCP套接字实现TCP通信(服务器)的代码案例，主要学习TCP协议
 *      @date   2025/02/21
 *      @author cecelmx@126.com 
 *      @note
 *              1.想要使用TCP套接字通信的前提是调用socket函数创建TCP套接字
 *                tcp_socket = socket(AF_INET, SOCK_STREAM, 0);
 * 
 *            
 * 
 *      @version  xx.xx.xx   主版本号.次版本号.修正版本号
 * 
 *      CopyRight (c)   2024-2025   Your Name     All Right Reserved
 * 
 * ****************************************************************************************/

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/udp.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pthread.h>

#define  MYPORT   8888   //自身的端口号

int main(int argc,char **argv)
{

    //1.创建TCP套接字
    int tcp_socket = socket(AF_INET, SOCK_STREAM, 0); 
    if(-1 == tcp_socket)
    {
        fprintf(stderr,"create tcp socket error,%s\n",strerror(errno));
        exit(-1);
    }
    
    //2.把自身的端口和IP地址绑定到套接字
    struct sockaddr_in myinfo ={0};         //IPv4地址格式的实例
    myinfo.sin_family = AF_INET;            //IPv4协议族
    myinfo.sin_port   = htons(MYPORT);      //自身端口，需要转换为网络字节序
    myinfo.sin_addr.s_addr = INADDR_ANY;    //自身地址，需要转换为网络字节序

    bind(tcp_socket,(struct sockaddr *)&myinfo,sizeof(myinfo));
    printf("server bind ok\n");

    //3.设置套接字为监听状态，最大连接数是5，也就是处于等待连接状态的客户端的数量最大是5
    listen(tcp_socket,5);
    printf("server listen ok\n");


    //4.服务器可以接受连接请求,该函数具有阻塞性质，当队列中没有客户端连接请求，则会阻塞！
    int client_fd = accept(tcp_socket,NULL,NULL);
    if(-1 == client_fd)
    {
        fprintf(stderr,"accept error,%s\n",strerror(errno));
        exit(-2);
    }
    printf("server accept ok\n");

    //5.可以和客户端进行通信 send()/recv()  or  write()/read()  or  sendto()/recvfrom()
    char recvbuf[1024] ={0};
    for(;;)
    {
        read(client_fd,recvbuf,sizeof(recvbuf));
        printf("recv data from client is [%s]\n",recvbuf);
    }

    return 0;
}

